package com.hbue.springboot.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hbue.springboot.mapper.WorkerSalaryMapper;
import com.hbue.springboot.service.WorkerSalaryService;
import com.hbue.springboot.vo.QueryParamsVo;
import com.hbue.springboot.vo.WorkerSalaryVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

/**
 * 统计工资模块业务逻辑接口实现类
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class WorkerSalaryServiceImpl extends ServiceImpl<WorkerSalaryMapper, WorkerSalaryVo> implements WorkerSalaryService{

        private final WorkerSalaryMapper workerSalaryMapper;


    /**
     * 统计送水工工资
     步骤如下：
     * 1 获取分页参数（当前页码、每页条数）
     2 获取其它查询参数（开始时间、结束时间、类型）
     * 3 判断“开始时间”是否为空，如果为空系统当前时间的前一个月默认为“开始时间”
     * 4 判断“结束时间”是否为空，如果为空系统当前时间默认为“结束时间”
     5 对“类型”进行判断，如果为1统计“指定时间段为客户送过水的送水工工资”。否则统计“没有在指定时间段为客户送水的送水工信息”
     * @param queryParamsVO 前端传入的分页查询对象
     * @return 分页对象
     */
    @Override
    public IPage<WorkerSalaryVo> listWorkerSalary(QueryParamsVo queryParamsVO) {
        Integer pageNum = queryParamsVO.getPageNum();
        Integer pageSize = queryParamsVO.getPageSize();
        Map<String, Object> params = queryParamsVO.getParams();
        String beginTime = (String)params.get("beginTime");
        String endTime = (String)params.get("endTime");
        String type = (String) params.get("type");
        // 条件成立：开始时间为空，默认取当前日期的前一个月
        if (StrUtil.isBlank(beginTime)) {
            LocalDateTime ldt = LocalDateTime.now().minusMonths(1);
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            beginTime = dtf.format(ldt);
        }
        // 条件成立： 结束时间为空，默认为当前系统时间
        if (StrUtil.isBlank(endTime)) {
            LocalDateTime ldt = LocalDateTime.now();
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            endTime = dtf.format(ldt);
        }
        // 条件成立：统计指定时间段为客户送过水的送水工工资，否则查询没有在指定时间段为客户送水的送水工信息。
        if (type.equals("1")) {
            return getWorkerSalaryList(pageNum, pageSize, beginTime, endTime);
        } else {
            return getNonWorkerSalary(pageNum,pageSize,beginTime,endTime);
        }

    }

    @Override
    public double getPayByName(String workerName)
    {
        return workerSalaryMapper.getPayByName(workerName);
    }

    @Override
    public Double getSalaryByName(String workerName, QueryParamsVo query) {

        Map<String, Object> params = query.getParams();
        String beginTime = (String)params.get("beginTime");
        String endTime = (String)params.get("endTime");
        // 条件成立：开始时间为空，默认取当前日期的前一个月
        if (StrUtil.isBlank(beginTime)) {
            LocalDateTime ldt = LocalDateTime.now().minusMonths(1);
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            beginTime = dtf.format(ldt);
        }
        // 条件成立： 结束时间为空，默认为当前系统时间
        if (StrUtil.isBlank(endTime)) {
            LocalDateTime ldt = LocalDateTime.now();
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            endTime = dtf.format(ldt);
        }
        log.info("workerName:{}",workerName);
        Double pay = getSalaryByName(workerName, beginTime, endTime);
        return pay;
    }

    private Double getSalaryByName(String workerName,String beginTime, String endTime){
        Double res = workerSalaryMapper.getSalaryByName(workerName,beginTime,endTime);
        log.info("------------------res:"+res);
        return res;
    }

    /**
     * 查询没有在指定时间段为客户送水的送水工信息。
     * @param pageNum 当前页码
     * @param pageSize 每页大小
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @return Page对象
     */
    private IPage<WorkerSalaryVo> getNonWorkerSalary(Integer pageNum, Integer pageSize, String beginTime, String endTime) {
        QueryWrapper<WorkerSalaryVo> qwOne = new QueryWrapper<>();
        qwOne.notBetween("h.send_water_time",beginTime,endTime);

        QueryWrapper<WorkerSalaryVo> qwTwo = new QueryWrapper<>();
        qwTwo.between("send_water_time",beginTime,endTime);

        IPage<WorkerSalaryVo> page = new Page<>(pageNum , pageSize);
        return workerSalaryMapper.listNonWorkerSalary(page, qwOne, qwTwo);
    }

    /**
     * 统计指定时间段为客户送过水的送水工工资
     * @param pageNum 当前页码
     * @param pageSize 每页大小
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @return Page对象
     */
    private IPage<WorkerSalaryVo> getWorkerSalaryList(Integer pageNum, Integer pageSize, String beginTime, String endTime) {

        QueryWrapper<WorkerSalaryVo> queryWrapper = new QueryWrapper<>();
        queryWrapper.between("h.send_water_time", beginTime, endTime);

        IPage<WorkerSalaryVo> page = new Page<>(pageNum,pageSize);
        return  workerSalaryMapper.listWorkerSalary(page,queryWrapper);
    }
}
